﻿using System;
using System.Collections.Generic;
using System.Security.Policy;
using System.Threading;
using System.Windows.Forms;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization.Formatters.Soap;
using System.Xml.Serialization;
using System.Diagnostics;
using System.Security;

namespace StudySerialization
{
    public partial class Form1 : Form
    {
        private const string filename = @"c:\\temp\\apps.txt";
        private const string filenameXml = @"c:\\temp\\apps.xml";
        private AppDomain dom;

        
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string dati;
            FileStream fs;


            dati = "Questo e' quello che devo scrivere in un file";
            fs = null;

            // Creo file
            try
            {
                fs = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite, FileShare.None);

            }
            catch (IOException ioexc)
            {

                MessageBox.Show(ioexc.Message , "test");
                return;
            }

            // Creo il binary formatter
            BinaryFormatter bf = new BinaryFormatter();

            // Serializzo
            bf.Serialize(fs, dati);

            bf = null;

            // Salvo e chiudo
            fs.Close();
            fs.Dispose();
            fs = null;

        }

        private void button2_Click(object sender, EventArgs e)
        {
            FileStream fs;
            string stringa;
            
            fs = null;
            stringa = "";

            try
            {
                fs = new FileStream(filename, FileMode.Open);
            }
            catch (FileNotFoundException fnf)
            {
                MessageBox.Show(fnf.Message, "test");
                return;
            }

            BinaryFormatter bf = new BinaryFormatter();

            stringa = bf.Deserialize(fs).ToString();

            MessageBox.Show(stringa);

            bf = null;
            fs.Close();
            fs.Dispose();
            fs = null;

        }

        private void button3_Click(object sender, EventArgs e)
        {
            File.Delete(filename);
        }

        private void button4_Click(object sender, EventArgs e)
        {
            App app, app2;
            List<App> applications;
            FileStream fs;
            

            applications = new List<App>();

            applications.Add(new App(3431, "Angry Birds 1.0", App.Gender.Game, "me"));
            applications.Add(new App(6644, "iWork 5.0", App.Gender.Work, "n/d"));

            app = new App(9000, "Original", App.Gender.Game, "marcus");
            // Alzo i flag per due dispositivi
            app.dispositivi = App.Dispositivi.iPad | App.Dispositivi.iPhone;
            
            // Cerco il singolo flag
            if ((app.dispositivi & App.Dispositivi.iPod) == App.Dispositivi.iPod)
            {
                Console.WriteLine(app.name + " è compatibile con iPod!");
            }
            if ((app.dispositivi & App.Dispositivi.iPad) == App.Dispositivi.iPad)
            {
                Console.WriteLine(app.name + " è compatibile con iPad!");
            }
            if ((app.dispositivi & App.Dispositivi.iPad2) == App.Dispositivi.iPad2)
            {
                Console.WriteLine(app.name + " è compatibile con iPad2!");
            }
            if ((app.dispositivi & App.Dispositivi.iPhone) == App.Dispositivi.iPhone)
            {
                Console.WriteLine(app.name + " è compatibile con iPhone!");
            }

            // Cerco le combinazioni!

            switch (app.dispositivi)
            {
                case App.Dispositivi.iPad | App.Dispositivi.iPad2:
                    {
                        Console.WriteLine("WOW");
                        break;
                    }
            }



            app2 = app;

            app2.name = "Copy";

            applications.Add(app);
            applications.Add(app2);

            fs = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite, FileShare.None);

            // Creo il binary formatter
            BinaryFormatter bf = new BinaryFormatter();

            // Serializzo
            bf.Serialize(fs, applications);

            

            // Salvo e chiudo
            fs.Close();
            fs.Dispose();
            applications.Clear();

            // Deserializzo

            fs = new FileStream(filename, FileMode.Open);

            applications = (List<App>)bf.Deserialize(fs);

            foreach (App apparray in applications)
            {
                MessageBox.Show(apparray.ToString());

            }

            

            bf = null;
            fs.Close();
            fs.Dispose();
            fs = null;
            

        }

        private void button5_Click(object sender, EventArgs e)
        {
            string str;
            Int32 numero;
            FileStream fs;


            fs = new FileStream(filenameXml, FileMode.Create, FileAccess.ReadWrite, FileShare.None);
            str = "stringtosoap";
            numero = 33;

            // Creo il Soap formatter
            SoapFormatter sf = new SoapFormatter();

            // Serializzo tramite Soap
            sf.Serialize(fs, str);
            sf.Serialize(fs,numero);

            // Salvo e chiudo
            fs.Close();
            fs.Dispose();

        }

        private void button6_Click(object sender, EventArgs e)
        {
            App app;
            List<App> applications;
            FileStream fs;

            applications = new List<App>();

            applications.Add(new App(3431, "Angry Birds 1.0", App.Gender.Game, "me"));
            applications.Add(new App(6644, "iWork 5.0", App.Gender.Work, "n/d"));

            fs = new FileStream(filenameXml, FileMode.Create, FileAccess.ReadWrite, FileShare.None);

            // Creo l'xmlSerializer formatter
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<App>));

            // Serializzo
            xmlSerializer.Serialize(fs, applications);



            // Salvo e chiudo
            fs.Close();
            fs.Dispose();
            applications.Clear();

            // Deserializzo

            fs = new FileStream(filenameXml, FileMode.Open);

            applications = (List<App>) xmlSerializer.Deserialize(fs);
            foreach (App apparray in applications)
            {
                MessageBox.Show(apparray.id.ToString(), "id");
                MessageBox.Show(apparray.name.ToString(), "name");
                MessageBox.Show(apparray.cathegory.ToString(), "cathegory");
                MessageBox.Show(apparray.author.ToString(), "author");

            }



            xmlSerializer = null;
            fs.Close();
            fs.Dispose();
            fs = null;
            

        }

        private void button7_Click(object sender, EventArgs e)
        {
            // Ricava le informazioni sul file serializzato
            FileInfo xmlFile = new FileInfo(filenameXml);

            MessageBox.Show("Nome: " + xmlFile.Name);
            MessageBox.Show("Dimensione: " + xmlFile.Length + " bytes");
            MessageBox.Show("Cartella: " + xmlFile.DirectoryName);
            MessageBox.Show("Estensione: " + xmlFile.Extension);
            MessageBox.Show("Full name: " + xmlFile.FullName);

            

            
        }

        class App1 : IApp
        {

            public string AppName { get; set; }

            public string AppAuthor { get; set; }

            public App1(string pName, string pAut)
            {
                AppName = pName;
                AppAuthor = pAut;
            }

            public string test()
            {
                string ret;

                ret = "Name: " + AppName.ToString() + " - Author: " + AppAuthor.ToString();
                return ret;
            }

        }




        private void button8_Click(object sender, EventArgs e)
        {
            App1 myNewApp = new App1("giochissimo", "mauro");
            string ret = myNewApp.test();
            MessageBox.Show("Risultato: " + ret);

            MyGenerics<App1> myGenApp = new MyGenerics<App1>();
            ret = myGenApp.GiveMeTheName(myNewApp);
            MessageBox.Show("Risultato: " + ret);

            App1 mySecondApp = new App1("lavorissimo", "eric");
            ret = mySecondApp.test();
            MessageBox.Show("Risultato2: " + ret);

            ret = myGenApp.GiveMeTheName(mySecondApp);
            MessageBox.Show("Risultato2: " + ret);

            App1 myThirdApp = new App1("moredifficult", "fsw_eric");
            ret = myThirdApp.test();
            MessageBox.Show("Risultato3: " + ret);

            MyGenerics<App1> myGenApp2 = new MyGenerics<App1>(myThirdApp);
            ret = myGenApp2.GiveMeTheNameWitNoArgs();
            MessageBox.Show("Risultato3: " + ret);



        }

        private void button9_Click(object sender, EventArgs e)
        {
            //EventLog DemoLog = new EventLog("Application");
            //DemoLog.Source = "MauroLog";
            //DemoLog.WriteEntry("button9_click XXX has been clicked", EventLogEntryType.Information);

            //EventLog.CreateEventSource("MauroPC", "MauroPC");
            EventLog DemoLog = new EventLog("MauroPC", "CARTA7", "MauroPC");

            Debugger.Log(2, "cat", "msg");

            DemoLog.WriteEntry("il mio messaggio", EventLogEntryType.Information, 234, Convert.ToInt16(3));

            Trace.Listeners.Clear();
            DefaultTraceListener MyListener = new DefaultTraceListener();
            Trace.Listeners.Add(MyListener);
            Debugger.Log(2, "Test", "This is a test");
            
            //Debug.Fail("ahi ahi ahi");

            Debug.Assert(true, "messaggio", "dettaglio del messaggio");
            //EventLog.Delete("MauroLog");

        }

        private void button10_Click(object sender, EventArgs e)
        {

            
            object [] hostEvidence = {new Zone(SecurityZone.MyComputer)};


            Evidence internetEvidenze = new Evidence(hostEvidence, null);

            dom = AppDomain.CreateDomain("MauroDomain");

            //MessageBox.Show("System Domain: " + AppDomain.CurrentDomain.FriendlyName);

            //MessageBox.Show("New Created Domain: " + dom.FriendlyName);

            // Con questo sistema posso eseguire un assembly in un dominio istanziato dando
            // una particolare evidence

            dom.ExecuteAssembly("StudyRegEx.exe", internetEvidenze);

            // O uso questo se voglio specificare solo il nome:
            //dom.ExecuteAssemblyByName()

            // continuare da pag 450



        }

        private void button11_Click(object sender, EventArgs e)
        {
            AppDomain.Unload(dom);
        }


        public string DelegFunct1()
        {
            return "Buongiorno dalla funzione DelegFunct1()";
        }

        public string DelegFunct2()
        {
            return "Buongiorno dalla funzione DelegFunct2()";
        }

        public delegate string IlDelegato();


        private void button12_Click(object sender, EventArgs e)
        {

            string str;

            IlDelegato delegPerFunz1 = new IlDelegato(DelegFunct1);
            IlDelegato delegPerFunz2 = new IlDelegato(DelegFunct2);

            str = delegPerFunz1();
            MessageBox.Show(str);

            str = delegPerFunz2();
            MessageBox.Show(str);



        }

        private void button13_Click(object sender, EventArgs e)
        {
            // Ottengo una lista di tutti i files in una directory

            string dir = @"c:\temp";
            DirectoryInfo dirInfo = new DirectoryInfo(dir);

            foreach (FileInfo file in dirInfo.GetFiles())
            {
                
                Console.WriteLine("File {0} - Dimensione {1} - LastWriteTime {2}", file.Name, file.Length, file.LastWriteTime);
            }

        }

        private void button14_Click(object sender, EventArgs e)
        {
            // Classe per rilevare tutte le modifiche fatte in una cartella
            
            string dir = @"c:\temp";
            FileSystemWatcher watcher = new FileSystemWatcher(dir);

            // Registro gli eventi di creazione e cancellazione, devo sapere il NOME del delegato in base all'evento
            // questo perche' possono cambiare gli argomenti!
            watcher.Created += new FileSystemEventHandler(watcher_Changed);
            watcher.Renamed += new RenamedEventHandler(watcher_Renamed);

            watcher.EnableRaisingEvents = true;


        }

        private void watcher_Changed(object sender, FileSystemEventArgs e)
        {
            MessageBox.Show("Tipo di cambio " + e.ChangeType + " path: " + e.FullPath);
        }

        private void watcher_Renamed(object sender, RenamedEventArgs e)
        {
            MessageBox.Show("Rinominato da " + e.OldName + " a " + e.Name);
        }
    }
}
